#pragma once
#include "stdafx.h"
#include "DeviceClass.h"

class DeviceClass;
class Component;

class DeviceContext :public Component
{
private:
	DeviceContext();
	DeviceContext(const DeviceContext&);
	
public:
	typedef boost::shared_ptr<DeviceContext> sPtr;
	DeviceContext(
		ID3D11DeviceContext*,
		ID3D11RenderTargetView*,
		ID3D11Texture2D*,
		ID3D11DepthStencilState*,
		ID3D11DepthStencilView*,
		ID3D11RasterizerState*,
		DeviceClass*);
	~DeviceContext();
	void AddedToObject();
	ID3D11DeviceContext* GetDeviceContext();

private:
	void SetDepthStencilState(const Message& msg);
	void SetRenderTargets(const Message& msg);
	void SetRasterizerState(const Message& msg);
	void SetViewports(const Message& msg);
	void ClearRenderTargetView(const Message& msg);
	void ClearDepthStencilView(const Message& msg);
	void SetBlendState(const Message& msg);
	void PSSetShaderResources(const Message& msg);
	void VSSetConstantBuffers(const Message& msg);
	void PSSetConstantBuffers(const Message& msg);
	void SetInputLayout(const Message& msg);
	void PSSetShader(const Message& msg);
	void VSSetShader(const Message& msg);
	void SetVertexBuffers(const Message& msg);
	void SetIndexBuffers(const Message& msg);
	void SetPrimitiveTopology(const Message& msg);
	void DrawIndex(const Message& msg);
	void PSSetSamplers(const Message& msg);
	void UpdateBuffer(const Message& msg);
	void Draw(const Message& msg);
	void Reset(const Message& msg);
	
	ID3D11DeviceContext* m_deviceContext;
	ID3D11RenderTargetView* m_renderTargetView;
	ID3D11Texture2D* m_depthStencilBuffer;
	ID3D11DepthStencilState* m_depthStencilState;
	ID3D11DepthStencilView* m_depthStencilView;
	ID3D11RasterizerState* m_rasterState;
	D3D11_VIEWPORT m_viewport;
	DeviceClass* m_device;

};